package cn.acheng1314.im.socket.coder;

import cn.acheng1314.im.common.model.MessageBean;
import cn.acheng1314.im.socket.constant.ImConstant;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * 服务器下发消息前置编码处理器
 */
public class SocketMessageEncoder extends MessageToByteEncoder<MessageBean> {

    /**
     * 数据格式： |消息头|消息内容| <br/>
     * 消息头：TLV格式（Tag,Length,Value）
     *
     * @param ctx
     * @param msg
     * @param out
     * @throws Exception
     */
    @Override
    protected void encode(ChannelHandlerContext ctx, MessageBean msg, ByteBuf out) throws Exception {
        byte[] body = msg.getBody();
        byte[] header = createHeader(msg.getType(), body.length);
        out.writeBytes(header);
        out.writeBytes(body);
    }

    /**
     * 创建消息头，结构为 TLV格式（Tag,Length,Value）
     * 第一字节为消息类型
     * 第二，三字节为消息长度分隔为高低位2个字节
     */
    private byte[] createHeader(byte type, int length) {
        byte[] header = new byte[ImConstant.DATA_HEADER_LENGTH];
        header[0] = type;
        header[1] = (byte) (length & 0xff);
        header[2] = (byte) ((length >> 8) & 0xff);
        return header;
    }
}
